package com.atguigu1.core.operator

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 *
 * @description: 相同的key对value进行聚合操作
 * @time: 2021-03-12 11:45
 * @author: baojinlong
 **/
object Spark22FlodByKey {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("rdd")
    // 设置rdd分区数字
    val sparkContext = new SparkContext(conf)
    // 排序后分区数量不变 hash range分区 python分区是私有的
    val rddValue: RDD[(String, Int)] = sparkContext.makeRDD(Seq(("a", 1), ("a", 2), ("b", 3), ("b", 4), ("b", 5), ("a", 6)), 2)

    /**
     * aggregateByKey存在函数柯里化,有两个参数列表
     * 第一个参数列表:需要传递一个参数表示初始值,用于当碰见第一个key的时候和value进行分区 内 计算
     * 第一个参数:分区内计算规则 分区内求最大值 a[1,2] a[3,4]=>(a,2) (a,4)
     * 第二个参数:分区间计算规则 分区间再求和a(2+4)=(a,6)
     */
    // rddValue.aggregateByKey(0)((x, y) => Math.max(x, y), (x, y) => x + y).collect.foreach(println)
    // spark中如果分区内和分区间计算规则相同那么就可以直接使用foldByKey
    rddValue.foldByKey(0)(_ + _).collect.foreach(println)

    sparkContext.stop()
  }
}
